﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>


//int main()
//{
//	int arr[10] = { 0 };
//	for (int i = 0; i < 10; i++)
//	{
//		arr[i] = i;
//	}
//	return 0;
//}



//int main()
//{
//	int sum = 0;
//	int n = 0;
//	scanf("%d", &n);
//
//	//计算1到n的阶乘之和
//	for (int i = 1; i <= 10; i++)
//	{
//		int ret = 1;
//		//计算当前i的阶乘
//		for (int j = 1; j <= i; j++)
//		{
//			ret *= j;
//		}
//		sum += ret;
//	}
//	printf("%d\n", sum);
//	return 0;
//}


//#include<stdlib.h>
//int main()
//{
//	//开辟内存空间
//	int* ptr = (int*)malloc(10 * sizeof(int));
//	//如果开辟失败
//	if (ptr == NULL)
//	{
//		perror("内存开辟失败");
//		return EXIT_FAILURE;//标准退出码
//	}
//
//	//为动态数组赋值
//	for (int i = 0; i < 10; i++)
//	{
//		ptr[i] = i;
//	}
//	
//	//使用动态数组
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", ptr[i]);
//	}
//	//释放内存并置空指针
//	free(ptr);
//	ptr = NULL;
//	return 0;
//}


//#include <stdlib.h>
//int main()
//{
//	int* p = (int*)calloc(10, sizeof(int));
//	//如果开辟失败
//	if (p == NULL) 
//	{
//		perror("内存分配失败");
//		return EXIT_FAILURE;  
//	}
//
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", p[i]);
//	}
//
//	free(p);
//	p = NULL;
//	return 0;
//}



//#include <stdlib.h>
//int main()
//{
//	int* ptr = (int*)malloc(100);
//	if (ptr == NULL)
//	{
//		perror("malloc failed");
//		return;
//	}
//	//...业务处理
//	//如果内存不够了
//	
//	//扩展容量
//	int* p = realloc(ptr, 1000);
//	if (p == NULL)
//	{
//		perror("realloc failed");
//		return;
//	}
//
//	//新开辟的空间赋值给ptr
//	ptr = p;
//
//
//	free(ptr);
//	ptr = NULL;
//	return 0;
//}

//#include<stdlib.h>
//
//int main()
//{
//	int* p = (int*)malloc(INT_MAX / 4);
//	*p = 20;
//
//	free(p);
//	p = NULL;
//	return 0;
//}

//#include<stdlib.h>
//
//int main()
//{
//	int* p = (int*)malloc(10 * sizeof(int));
//	if (NULL == p)
//	{
//		perror("malloc failed");
//		exit(EXIT_FAILURE);
//	}
//
//	for (int i = 0; i <= 10; i++)
//	{
//		p[i] = i;
//	}
//
//	free(p);
//	p = NULL;
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int* p = &a;
//	free(p);
//	return 0;
//}

//#include<stdlib.h>
//int main()
//{
//	int* p = (int*)malloc(100);
//	p++;
//	free(p);//p不再指向动态内存的起始位置 
//	return 0;
//}
//#include<string.h>
//
//void GetMemory(char* p)
//{
//	p = (char*)malloc(100);
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(str);
//	strcpy(str, "hello world");
//	printf(str);
//}
//
//int main()
//{
//	Test();
//	return 0;
//}



//int main()
//{
//	int a = 10000;
//	FILE* pf = fopen("test.txt", "wb");
//	fwrite(&a, 4, 1, pf);//⼆进制的形式写到⽂件中 
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//int main()
//{
//	FILE* pFile;
//	//打开⽂件 
//	pFile = fopen("myfile.txt", "w");
//	//⽂件操作 
//	if (pFile != NULL)
//	{
//		fputs("fopen example", pFile);
//		//关闭⽂件 
//		fclose(pFile);
//	}
//	return 0;
//}



//int main()
//{
//	FILE* pFile;
//	long size;
//	pFile = fopen("myfile.txt", "rb");
//	if (pFile == NULL)
//		perror("Error opening file");
//	else
//	{
//		fseek(pFile, 0, SEEK_END); // non-portable
//		size = ftell(pFile);
//		fclose(pFile);
//		printf("Size of myfile.txt: %ld bytes.\n", size);
//	}
//	return 0;
//}

#include<stdlib.h>
//int main()
//{
//	int* p = (int*)malloc(100);
//	free(p);
//	free(p);//重复释放 
//	return 0;
//}

//int main()
//{
//	int* p = (int*)malloc(100);
//	if (NULL != p)
//	{
//		*p = 20;
//	}
//
//	return 0;
//}
//

//int main()
//{
//	//20个字节 --存放5个整数
//	int* p = (int*)malloc(20);
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	//使用空间
//	for (int i = 0; i < 5; i++)
//	{
//		*(p + i) = i + 1;
//	}
//
//	//释放内存
//	free(p);//传递给free函数的是要释放的内存空间
//	p = NULL;
//
//	return 0;
//}

//int main()
//{
//	int* p = (int*)calloc(5, sizeof(int));
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//
//	for (int i = 0; i < 5; i++)
//	{
//
//		printf("%d", *(p + i));
//	}
//	free(p);
//	p = NULL;
//
//	return 0;
//}

//int main()
//{
//	int* p = (int*)malloc(5*sizeof(int));
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	//使用
//	for (int i = 0; i < 5; i++)
//	{
//		*(p + i) = i + 1;
//	}
//
//	//希望将空间调整为40个字节
//	int* ptr = (int*)realloc(p, 40);
//	if (p != NULL)
//	{
//		p = ptr;
//		for (int i = 5; i < 10; i++)
//		{
//			*(p + i) = i + 1;
//		}
//
//		for (int i = 0; i < 10; i++)
//		{
//			printf("%d ", *(p + i));
//		}
//
//		free(p);
//		p = NULL;
//	}
//	//调整失败
//	else
//	{
//		perror("realloc");
//		free(p);
//		p = NULL;
//	}
//	return 0;
//}

//void test()
//{
//	int* p = (int*)malloc(10 * sizeof(int));
//	if (p == NULL)
//	{
//		exit(EXIT_FAILURE);
//	}
//	for (int i = 0; i <= 10; i++)
//	{
//		*(p + i) = i;//当i是10的时候越界访问 
//	}
//	free(p);
//	p = NULL;
//}

//void test()
//{
//	int a = 10;
//	int* p = &a;
//	free(p);
//}

//void test()
//{
//	int* p = (int*)malloc(100);
//	if (p == NULL)
//	{
//		return 1;
//	}
//	for (int i = 0; i < 5; i++)
//	{
//		*p = i + 1;
//		p++;
//	}
//	free(p);//这里的p不再是动态申请的内存的起始位置
//	p = NULL;
//}
//
//void test()
//{
//	int* p = (int*)malloc(100);
//	free(p);
//	free(p);//重复释放 
//}


//void test()
//{
//	int* p = (int*)malloc(100);
//	if (NULL != p)
//	{
//		*p = 20;
//	}
//}
//
//int main()
//{
//	test();
//	while (1);
//}


//#include<stdlib.h>
//#include<string.h>
//
//void GetMemory(char** p)
//{
//	*p = (char*)malloc(100);
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str);
//	strcpy(str, "hello world");
//	printf(str);
//	free(str);
//	str = NULL;
//}
//
//int main()
//{
//	Test();
//	return 0;
//}
//
//



//char* GetMemory(void)
//{
//	char p[] = "hello world";
//	return p;
//}
//
//void Test(void)
//{
//	char* str = NULL;
//	str = GetMemory();
//	printf(str);
//}
//
//int main()
//{
//	Test();
//	return 0;
//}

#include<string.h>
void Test(void)
{
	char* str = (char*)malloc(100);
	strcpy(str, "hello");
	free(str);
	str = NULL;
	if (str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
}

int main()
{
	Test();
	return 0;
}